import { SmartStorage } from './libs/IStorage';

/**
 * 全局存储前缀，建议在 .env 文件中配置 VITE_STORAGE_PREFIX 以区分不同项目或环境
 * 类型：string
 */
const storagePrefix: string = import.meta.env.VITE_STORAGE_PREFIX ?? '';

/**
 * localStg：基于 localStorage 的持久化存储实例
 * - encryptEnabled: 是否启用加密（此处为 false）
 * - globalExpirationTime: 全局过期时间（秒，0 表示永久）
 * - prefixKey: key 前缀
 * - storageType: 'local' 表示使用 localStorage
 */
export const localStg: SmartStorage = new SmartStorage({
	encryptEnabled: false,
	globalExpirationTime: 0,
	prefixKey: storagePrefix,
	storageType: 'local'
});

/**
 * sessionStg：基于 sessionStorage 的会话级存储实例
 * - 适用于仅需在当前会话（标签页）内保存的数据
 */
export const sessionStg: SmartStorage = new SmartStorage({
	encryptEnabled: false,
	globalExpirationTime: 0,
	prefixKey: storagePrefix,
	storageType: 'session'
});

/**
 * mapStg：基于内存 Map 的临时存储实例
 * - 适用于仅在当前页面生命周期内临时存储数据
 */
export const mapStg: SmartStorage = new SmartStorage({
	encryptEnabled: false,
	globalExpirationTime: 0,
	prefixKey: storagePrefix,
	storageType: 'map'
});

/**
 * objectStg：基于 JS 对象的极简内存存储实例
 * - 适用于极短生命周期、无需持久化的场景
 */
export const objectStg: SmartStorage = new SmartStorage({
	encryptEnabled: false,
	globalExpirationTime: 0,
	prefixKey: storagePrefix,
	storageType: 'object'
});

/**
 * ========================= 典型用法示例 =========================
 *
 * // 1. 存储数据（localStg 支持持久化，mapStg/objectStg 仅内存）
 * localStg.set('user', { name: '张三', age: 18 });
 *
 * // 2. 获取数据（自动类型推断）
 * const user = localStg.get<{ name: string; age: number }>('user');
 *
 * // 3. 移除数据
 * localStg.remove('user');
 *
 * // 4. 清空所有存储内容
 * localStg.clear();
 *
 * // 5. 使用 sessionStg/mapStg/objectStg 方法完全一致，仅存储介质不同
 *
 * // 6. 选择建议：
 * //   - localStg：适合需持久保存的数据（如 token、用户信息）
 * //   - sessionStg：适合仅需会话级别保存的数据
 * //   - mapStg/objectStg：适合临时性、敏感性极高或无需持久化的数据
 *
 * // 7. 支持加密存储（需设置 encryptEnabled: true 并配置 secretKey）
 * //   const secureStg = new SmartStorage({ encryptEnabled: true, secretKey: 'xxx', ... });
 *
 * // 8. 支持全局/单条过期时间设置
 * //   localStg.set('foo', 'bar', 60); // 该条目 60 秒后过期
 *
 * // 9. 监听存储变更事件
 * //   window.addEventListener('storageChange', (e) => { ... });
 *
 * // 10. 更多高级用法详见 SmartStorage 类注释与源码
 */
